package com.gestion.dao;

import com.gestion.dao.interfaces.IProductoDAO;
import com.gestion.modelo.dominio.Producto;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

/**
 * @author Mauri@<itsoluciones.com.ar>
 */
public class ProductoDAO implements IProductoDAO {

    private static ProductoDAO Instancia = null;

    private static void crearInstancia() {
        Instancia = new ProductoDAO();
    }

    /**
     * Retorna una instancia de <tt>ProductoDAO</tt> si no existe la crea y la
     * guarda en una variable estatica
     *
     * @return un ProductoDAO
     */
    public static ProductoDAO getInstancia() {
        if (Instancia == null) {
            crearInstancia();//Patrón SINGLETON
        }
        return Instancia;
    }

    public ProductoDAO() {
        //System.out.println(this.toString());
    }

    @Override
    public Producto insertar(Producto p) {

        String sql = "INSERT INTO producto ("
                + "nombre, total, cantidadMinima) "
                + "VALUES(?,?,?)";
        try {
            System.out.println(sql);
            PreparedStatement ps = FabricaDAO.getConnection().prepareStatement(sql);
           
            ps.setString(1, p.getNombre());
            ps.setInt(2, p.getTotal());
            ps.setInt(3, p.getCantidadMinima());
            
            ps.executeUpdate();
            ps = FabricaDAO.getConnection().prepareStatement("SELECT * FROM producto ORDER BY id_producto DESC LIMIT 1");

            ResultSet rs = ps.executeQuery();
            System.out.println(rs.toString());
            if (rs.first()) {
                System.out.println("Largo = " + rs.getLong(1));
                return getPorId(rs.getLong(1));
                //return rs.getInt(1);
            }
            return null;
        } catch (SQLException ex) {
            System.out.println(ex.getMessage());
            //AnalisisDeError.analizarExeption(ex);
            return null;
        }
    }

    @Override
    public Producto modificar(Producto p) {
        String sql = "UPDATE producto SET  id_producto = ?, "
                + "nombre = ? , "
                + "total = ?, "
                + "cantidadMinima = ?, "
                + "WHERE id_producto = ? ";
        try {
            // Se crea el objeto PreparedStatement.
            // Este precompila la sentencia SQL especificada.
            // Los signos de interrogación señalan el lugar en que deben establecerse los
            // parámetros antes de que se ejecute la sentencia.
            PreparedStatement ps = FabricaDAO.getConnection().prepareStatement(sql);
            // Se establecen los parámetros y se ejecuta la sentencia.
            ps.setLong(1, p.getId());
            ps.setString(2, p.getNombre());
            ps.setInt(3, p.getTotal());
            ps.setInt(4, p.getCantidadMinima());
            
            ps.executeUpdate();
            return p;
        } catch (SQLException ex) {
            System.out.println(ex.getMessage());
            return null;
        }
    }

    @Override
    public List<Producto> getTodos() {
        String sql = "SELECT * FROM producto ";
        List<Producto> lp = null;
        try {
            PreparedStatement ps = FabricaDAO.getConnection().prepareStatement(sql);
            ResultSet rs = ps.executeQuery();
//            ResultSet rs = st.executeQuery(sql);
            if (rs == null) {
                return null;
            } else {
                lp = new ArrayList<Producto>();
                Producto c;
                while (rs.next()) {
                    c = new Producto(rs.getLong("id_producto"),
                            rs.getString("nombre"),
                            rs.getInt("total"),
                            rs.getInt("cantidadMinima"));
                    lp.add(c);
                }
                return lp;
            }
        } catch (SQLException ex) {
            System.out.println(ex.getMessage());
            return null;
        }
    }

    @Override
    public Producto getPorId(Long valorId) {
        String sql = "SELECT * FROM producto WHERE id_producto = ?";
        try {
            PreparedStatement ps = FabricaDAO.getConnection().prepareStatement(sql);
            ps.setLong(1, valorId);
            ResultSet rs = ps.executeQuery();
            if (rs.first()) {
                Producto p;
                p = new Producto(rs.getLong("id_producto"),
                        rs.getString("nombre"),
                        rs.getInt("total"),
                        rs.getInt("cantidadMinima"));
                return p;
            } else {
                return null;
            }
        } catch (SQLException ex) {
            System.out.println(ex.getMessage());
            return null;
        }
    }
}
